
var store_organizacion;
var store_cuenta;
var store_editor;
var store_tipo;

Ext.onReady(function()
{
    store_organizacion = new X.store.Json({
        fields : [
            'codigoOrganizacion',
            'razonSocial'
        ]
    });

    store_tipo = new X.store.Json({
        fields : [
            'codigoDocumento',
            'nombreDocumento'
        ]
    });

    store_cuenta = new X.store.Json({
        fields : [
            'codigoCuenta',
            'nombreRubro',
            'codigo',
            'valueField'
        ]
    });

    store_cuenta.addListener('load', function(store, records, options){
        for(var i=0; i<store.getCount(); i++){
            var record = store.getAt(i);
            record.set('valueField', record.get('codigo') + ' ' + record.get('nombreRubro'));
        }
    });

    store_editor = new X.store.Json({
        fields : [
            'cantidad',
            'concepto',
            'monto',
            'observaciones',
            'codigo',
            'codigoCuenta',
            'codigoMovimiento'
        ]
    });

    var combo = new X.field.Combo ({
        valueField   : 'codigoCuenta',
        displayField : 'valueField',
        width        : 230,
        store        : store_cuenta,
        editable     : true
    });

    var grid = new X.grid.GridEditor({

        id       : 'editor',
        height   : 250,
        width    : 1008,
        store    : store_editor,

        columns:[
            new X.column.Number({header: 'Cantidad',      dataIndex: 'cantidad',        width: 57,  editor: new X.field.Number({allowNegative:false, allowDecimals:false})}),
            new X.column.Text  ({header: 'Concepto',      dataIndex: 'concepto',        width: 250, editor: new X.field.Text()  }),
            new X.column.Money ({header: 'Monto',         dataIndex: 'monto',           width: 90,  editor: new X.field.Number({allowNegative:false, allowDecimals:false})}),
            new X.column.Text  ({header: 'Observaciones', dataIndex: 'observaciones',   width: 250, editor: new X.field.Text()  }),
            new X.column.Combo ({header: 'Rubro',         dataIndex: 'codigoCuenta',    width: 340, editor: combo})
        ]
    });

    grid.addListener('afteredit', function(e){
        e.record.commit();
    });

    // form invisible para hacer el submit desde el campo fechaComprobante
    var formSubmitCuenta = new Ext.form.FormPanel({
        renderTo : 'layout_content',
        hidden   : true
    });

    function actualizar_cuentas(){

        formSubmitCuenta.getForm().submit({
            url       : '/ingreso/ajax-cuenta',
            waitTitle : 'Aguarde un momento.',
            waitMsg   : 'Cargando las cuentas asociadas a la fecha del comprobante...',
            params    : {
                fecha : Ext.getCmp('fechaComprobante').getValue()
            },

            success : function(form, action){
                try{
                    if (action.result.msg){
                        store_cuenta.setJson(action.result.msg);

                        // eliminar las inconsistencias
                        for (var i=0; i<store_editor.getCount(); i++){
                            var re = store_editor.getAt(i);
                            var ok = false;

                            for (var j=0; j<store_cuenta.getCount(); j++){
                                var rc = store_cuenta.getAt(j);

                                if (re.get('codigoCuenta') == rc.get('codigoCuenta')){
                                    ok = true;
                                    break;
                                }
                            }
                            if (ok == false){
                                re.set('codigoCuenta', null);
                                re.commit();
                            }
                        }
                    }
                }
                catch(e){X.msg.FailureJs(e.message);}
            },
            failure : function(form, action){
                try{
                    if (action.failureType === Ext.form.Action.SERVER_INVALID){
                        X.msg.Failure(action.result.msg);
                    }
                    else X.msg.Failure('respuesta inválida del servidor');
                }
                catch(e){X.msg.FailureJs(e.message);}
            }
        });
    }

    var form = new X.form.FormPanel({

        title            : 'Editar Ingreso',
        submitButtonText : 'Guardar',
        returnButtonText : 'Cancelar',
        submitUrl        : '/ingreso/ajax-editar',
        returnUrl        : '/ingreso/listar',
        width            : 1080,
        labelWidth       : 130,

        items:[

            new Ext.form.FieldSet({title:'Comprobante',items:
            [
                new X.field.Hidden({                         id:'editorRows'                  }),
                new X.field.Hidden({                         id:'codigoComprobante'           }),
                new X.field.Number({fieldLabel:'Número',     id:'numeroComprobante', width:230, allowNegative:false, allowDecimals:false}),
                new X.field.Date  ({fieldLabel:'Fecha',      id:'fechaComprobante',  width:230,
                    listeners:{
                        change:function(field, newv, oldv){
                            if (Ext.isEmpty(Ext.getCmp('fechaComprobante').getValue())){
                                Ext.getCmp('fechaComprobante').setValue(oldv);
                            }
                            if (!Ext.getCmp('fechaComprobante').isValid()){
                                Ext.getCmp('fechaComprobante').setValue(oldv);
                            }
                            if (newv.getFullYear() == oldv.getFullYear()) return;

                            actualizar_cuentas();
                        }
                    }}),
                new X.field.Combo ({
                    id           : 'organizacion',
                    fieldLabel   : 'Cliente',
                    hiddenName   : 'codigoOrganizacion',
                    valueField   : 'codigoOrganizacion',
                    displayField : 'razonSocial',
                    width        : 230,
                    store        : store_organizacion
                }),
                new X.field.Combo ({
                    id           : 'tipo',
                    fieldLabel   : 'Tipo',
                    hiddenName   : 'codigoDocumento',
                    valueField   : 'codigoDocumento',
                    displayField : 'nombreDocumento',
                    width        : 230,
                    store        : store_tipo,
                    allowBlank   : true
                })
            ]}),
            new Ext.form.FieldSet({title:'Movimientos',items:
            [
                grid
            ]})
        ]
    });

    form.getForm().addListener('beforeaction', function(form, action){
        if (Ext.isEmpty(Ext.getCmp('numeroComprobante').getValue())){
            X.msg.Failure('Complete el campo "Número"'); return false;
        }
        if (Ext.isEmpty(Ext.getCmp('fechaComprobante').getValue())){
            X.msg.Failure('Complete el campo "Fecha"'); return false;
        }
        if (Ext.isEmpty(Ext.getCmp('organizacion').getValue())){
            X.msg.Failure('Complete el campo "Cliente"'); return false;
        }
        if (Ext.isEmpty(Ext.getCmp('tipo').getValue())){
            X.msg.Failure('Complete el campo "Tipo"'); return false;
        }
        if (store_editor.getCount() <= 0){
            X.msg.Failure('Agregue al menos un movimiento'); return false;
        }
        for (var i=0; i<store_editor.getCount(); i++){
            var record = store_editor.getAt(i);
            if (Ext.isEmpty(record.get('cantidad'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Cantidad" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('concepto'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Concepto" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('monto'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Monto" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('observaciones'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Observaciones" incompleto'); return false;
            }
            if (Ext.isEmpty(record.get('codigoCuenta'))){
                X.msg.Failure('El ' + (i+1) + '° movimiento tiene el campo "Rubro" incompleto'); return false;
            }
        }
        return true;
    });
});
